<?php
///////////////////////////////////////////////////////////////////////////////
//
// database.class.php
//
///////////////////////////////////////////////////////////////////////////////
//
// Esta clase se implemento para el manejo de la base de datos de MySql
//
// Nota para evitar algun conflicto de  codificacion se omitiran las tildes y �
// 
// Autor: Juan Diego Ocampo Q.
// Fecha de Creaci�n: 11/04/2008
// 
// Modificaciones:
// 1) A los redirect se les est� enviando el segundo parametro para que muestre 
//    un mensaje cuando no puede enviar a la pagina de error. (Juan Manuel - 30/09/08)
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// class Database
// Se utiliza para manejar la base de datos de Mysql.
///////////////////////////////////////////////////////////////////////////////
class Database 
{
	//////////////////////////////////////////////////////////////////////////////////////
	// nombre de usuario de la base de datos para la conexion 
	//////////////////////////////////////////////////////////////////////////////////////
	var $login;
	//////////////////////////////////////////////////////////////////////////////////////
	// password de usuario de la base de datos para la conexion 
	//////////////////////////////////////////////////////////////////////////////////////
	var $password;
		//////////////////////////////////////////////////////////////////////////////////////
	// nombre de usuario de la base de datos para la conexion 
	//////////////////////////////////////////////////////////////////////////////////////
	var $host;
		//////////////////////////////////////////////////////////////////////////////////////
	// nonbre/ubicacion del host de la base de datos
	//////////////////////////////////////////////////////////////////////////////////////
	var $conexion;
	//////////////////////////////////////////////////////////////////////////////////////
	// nonbre de la base de datos
	//////////////////////////////////////////////////////////////////////////////////////
	var $nombre;
		//////////////////////////////////////////////////////////////////////////////////////
	// indica si se imprime el error o se redireccionar a una pagina de error generico
	//////////////////////////////////////////////////////////////////////////////////////
	var $debug;
		//////////////////////////////////////////////////////////////////////////////////////
	// url a redireccionar en caso de error
	//////////////////////////////////////////////////////////////////////////////////////
	var $urlError;
	//////////////////////////////////////////////////////////////////////////////////////
	// mensaje a mostrar en caso de error
	//////////////////////////////////////////////////////////////////////////////////////
	var $msgError;
	//////////////////////////////////////////////////////////////////////////////////////
	// Constructor de clase. 
	// inicializa los atributos de la clase con los valores de las constantes del archivo 
	// de configuracion
	// 
	//
	// parameter: 
	// return: 
	// access public
	//
	// Autor: Juan Diego Ocampo Q.
	// Fecha de Creacion: 11/04/2008
	//////////////////////////////////////////////////////////////////////////////////////
	function Database()
	{
        require_once 'include/reg.config.php';
		$this->login = DATABASE_USER;
		$this->password = DATABASE_PASSWORD;
		$this->host = DATABASE_HOST;
		$this->nombre = DATABASE_NAME;
		$this->conexion = false;
		$this->debug = true;
		$this->urlError = URL_ERROR;
		$this->msgError = MSG_ERROR;
	}
	//////////////////////////////////////////////////////////////////////////////////////
	// crea la conexion y selecciona la base de datos. 
	// 
	//
	// parameter: 
	// return: 
	// access public
	//
	// Autor: Juan Diego Ocampo Q.
	// Fecha de Creacion: 11/04/2008
	//////////////////////////////////////////////////////////////////////////////////////
	function dbConnect()
	{
		$conexion = mysql_connect("localhost", "root", "root");
		if($conexion != false)
		{
			if(mysql_select_db("dbpasantiaeam"))
			{
				$this->conexion = $conexion;
			}
			else
			{
				if($this->debug == true)
				{
					echo "<h2>Error al seleccionar la base de datos ".$this->nombre."</h2>";
					echo "<p><b>MySQL Error</b>: ".mysql_error();
					die();
				}
				else
				{
                    //////////////////////////////////////////////////////////
                   // para hacer uso de estas lineas se debe colocar la variable
                   //debug = false
                   //ademas se debe eliminar todos espacios y html para poder 
                   //hacer buen uso del header, y ahy si funcionar mostrar 
                   // el mensaje de error
                   ////////////////////////////////////////////////////////////
                    header("Location: ./$this->urlError");
                    //redirect($this->urlError,$this->msgError);
					die();
				}
			}
		}
		else
		{
			if($this->debug == true)
			{
				echo "<h2>Error al conectar a ".$this->host." con el usuario ".$this->login."</h2>";
				echo "<p><b>MySQL Error</b>: ".mysql_error();
				die();
			}
			else
			{
				redirect($this->urlError,$this->msgError);
				die();
			}
		}
	}
	//////////////////////////////////////////////////////////////////////////////////////
	// cierra la conexion a la base de datos. 
	// 
	//
	// parameter: 
	// return: 
	// access public
	//
	// Autor: Juan Diego Ocampo Q.
	// Fecha de Creacion: 11/04/2008
	//////////////////////////////////////////////////////////////////////////////////////
	function dbDisconnect()
	{
		mysql_close();
	}	
	//////////////////////////////////////////////////////////////////////////////////////
	// envia una sentencia sql al motor de la base de datos
	// 
	//
	// parameter: sentencia sql
	// return: el id de la consulta (idquery)
	// access public
	//
	// Autor: Juan Diego Ocampo Q.
	// Fecha de Creacion: 11/04/2008
	//////////////////////////////////////////////////////////////////////////////////////
	function dbQuery($sql)
	{
		$qid = mysql_query($sql);
		if($qid != false)
		{
			return $qid;
		}
		else
		{
			if($this->debug == true)
			{
				echo "<h2>No se pudo ejecutar la consulta, verifique los datos ingresados anteriormente</h2>";
				echo "<pre>".$sql."</pre>";
				echo "<p><b>MySQL Error</b>: ".mysql_error();
				die();
			}
			else
			{
				redirect($this->urlError,$this->msgError);
				die();
				//return -1;
			}
		}
	}
	//////////////////////////////////////////////////////////////////////////////////////
	// retorna un registro de la base de datos
	// 
	//
	// parameter: el id de la consulta (idquery)
	// return: en un arreglo indexado y asociativo 
	// return: false en caso de no haber mas registros
	// access public
	//
	// Autor: Juan Diego Ocampo Q.
	// Fecha de Creacion: 11/04/2008
	//////////////////////////////////////////////////////////////////////////////////////
	function dbFetchArray($qid)
	{
		return mysql_fetch_array($qid);
	}
	//////////////////////////////////////////////////////////////////////////////////////
	// retorna un registro de la base de datos
	// 
	//
	// parameter: el id de la consulta (idquery)
	// return: en un arreglo indexado
	// return: false en caso de no haber mas registros
	// access public
	//
	// Autor: Juan Diego Ocampo Q.
	// Fecha de Creacion: 11/04/2008
	//////////////////////////////////////////////////////////////////////////////////////
	function dbFetchRow($qid)
	{
		return mysql_fetch_row($qid);
	}
	//////////////////////////////////////////////////////////////////////////////////////
	// retorna un registro de la base de datos
	// 
	//
	// parameter: el id de la consulta (idquery)
	// return: en un arreglo asociativo
	// return: false en caso de no haber mas registros
	// access public
	//
	// Autor: Juan Diego Ocampo Q.
	// Fecha de Creacion: 11/04/2008
	//////////////////////////////////////////////////////////////////////////////////////
	function dbFetchAssoc($qid)
	{
		return mysql_fetch_assoc($qid);
	}
	//////////////////////////////////////////////////////////////////////////////////////
	// retorna un registro de la base de datos
	// 
	//
	// parameter: el id de la consulta (idquery)
	// return: en un objeto
	// return: false en caso de no haber mas registros
	// access public
	//
	// Autor: Juan Diego Ocampo Q.
	// Fecha de Creacion: 11/04/2008
	//////////////////////////////////////////////////////////////////////////////////////
	function dbFetchObject($qid)
	{
		return mysql_fetch_object($qid);
	}
	//////////////////////////////////////////////////////////////////////////////////////
	// retorna numero de registros arrojados por la consulta
	// 
	//
	// parameter: el id de la consulta (idquery)
	// return: numero de registros arrojados por la consulta
	// access public
	//
	// Autor: Juan Diego Ocampo Q.
	// Fecha de Creacion: 11/04/2008
	//////////////////////////////////////////////////////////////////////////////////////
	function dbNumRows($qid)
	{
		return mysql_num_rows($qid);
	}
	//////////////////////////////////////////////////////////////////////////////////////
	// retorna numero de registros afectados por la consulta
	// 
	//
	// parameter: el id de la consulta (idquery)
	// return: numero de registros afectados por la consulta
	// access public
	//
	// Autor: Juan Diego Ocampo Q.
	// Fecha de Creacion: 11/04/2008
	//////////////////////////////////////////////////////////////////////////////////////
	function dbAffectedRows($qid)
	{
		return mysql_affected_rows($qid);
	}
	//////////////////////////////////////////////////////////////////////////////////////
	// retorna codigo (id) del ultimo registro insertado
	// 
	//
	// parameter: 
	// return: codigo (id) del ultimo registro insertado
	// access public
	//
	// Autor: Juan Diego Ocampo Q.
	// Fecha de Creacion: 11/04/2008
	//////////////////////////////////////////////////////////////////////////////////////
	function dbInsertId()
	{
		return mysql_insert_id();
	}
	//////////////////////////////////////////////////////////////////////////////////////
	// libera los recursos usados por la consulta
	// 
	//
	// parameter: el id de la consulta (idquery)
	// return: int
	// access public
	//
	// Autor: Juan Diego Ocampo Q.
	// Fecha de Creacion: 11/04/2008
	//////////////////////////////////////////////////////////////////////////////////////
	function dbFreeResult($qid)
	{
		return mysql_free_result($qid);
	}
	//////////////////////////////////////////////////////////////////////////////////////
	// retorna el numero de campos arrojados pos la projeccion de la consulta
	// 
	//
	// parameter: el id de la consulta (idquery)
	// return: numero de campos arrojados pos la projeccion de la consulta
	// access public
	//
	// Autor: Juan Diego Ocampo Q.
	// Fecha de Creacion: 11/04/2008
	//////////////////////////////////////////////////////////////////////////////////////
	function dbNumFields($qid)
	{
		return mysql_num_fields($qid);
	}
	//////////////////////////////////////////////////////////////////////////////////////
	// retorna nombre del campo especificado de la projeccion de la consulta
	// 
	//
	// parameter: $qid id de la consulta (idquery)
	// parameter: $indice posicion del campo
	// return: numero de campos arrojados pos la projeccion de la consulta
	// access public
	//
	// Autor: Juan Diego Ocampo Q.
	// Fecha de Creacion: 11/04/2008
	//////////////////////////////////////////////////////////////////////////////////////
	function dbFieldName($qid, $indice)
	{
		return mysql_field_name($qid, $indice);
	}
	//////////////////////////////////////////////////////////////////////////////////////
	// posiciona el puntero de la consulta en el indice especificado
	// 
	//
	// parameter: $qid id de la consulta (idquery)
	// parameter: $indice posicion de la fila o registro
	// return: numero de campos arrojados pos la projeccion de la consulta
	// access public
	//
	// Autor: Juan Diego Ocampo Q.
	// Fecha de Creacion: 11/04/2008
	//////////////////////////////////////////////////////////////////////////////////////
	function dbDataSeek($qid, $indice)
	{
		return mysql_data_seek($qid, $indice);
	}
	//////////////////////////////////////////////////////////////////////////////////////
	// Inserta un registro en la base de datos 
	// 
	//
	// parameter: $datos areglo asociativo
	// parameter: $tabla nombre de la tabla en la que ingresa el registro
	// return: true en caso de exito
	// return: false en caso de no exito
	// access public
	//
	// Autor: Juan Diego Ocampo Q.
	// Fecha de Creacion: 11/04/2008
	//////////////////////////////////////////////////////////////////////////////////////
	function dbInsert($datos, $tabla)
	{
		$fields = array();
		$values = array();
		
		foreach($datos as $key => $val)
		{
			$fields[] .= $key;
			$values[] .= "'".$val."'";
		}
		
		$sql_insert = "INSERT INTO ".$tabla." (".implode(",", $fields).") VALUES(".implode(",", $values).")";
		if($this->dbQuery($sql_insert) != false)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	//////////////////////////////////////////////////////////////////////////////////////
	// Actualiza un registro en la base de datos 
	// 
	//
	// parameter: $datos areglo asociativo
	// parameter: $tabla nombre de la tabla en la que ingresa el registro
	// return: true en caso de exito
	// return: false en caso de no exito
	// access public
	//
	// Autor: Juan Diego Ocampo Q.
	// Fecha de Creacion: 11/04/2008
	//////////////////////////////////////////////////////////////////////////////////////
	function dbUpdate($datos, $tabla, $id, $camp="id")
	{
		$fields_vals = array();
		
		foreach($datos as $key=>$val)
		{
			$fields_vals[] .= $key."='".$val."'";
		}
		
		$query = "UPDATE ".$tabla." SET ".implode(",", $fields_vals)." WHERE ".$camp."='".$id."'";
		if($this->dbQuery($query) != false)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	//////////////////////////////////////////////////////////////////////////////////////
	// Devuelve el contenido de un campo de un resultado 
	// 
	//
	// parameter: $qid el id de la consulta (idquery)
	// parameter: $campo nombre del campo (o alias) 
	// return: valor del campo especificado
	// access public
	//
	// Autor: Juan Diego Ocampo Q.
	// Fecha de Creacion: 11/04/2008
	//////////////////////////////////////////////////////////////////////////////////////
	function dbResult($qid, $campo)
	{
		return mysql_result($qid,0,$campo);
	}
	//////////////////////////////////////////////////////////////////////////////////////
	// Bloquea una tabla a modo de escritura
	// 
	//
	// parameter: $tabla nombre de la tabla
	// return: true en caso de exito
	// return: false en caso de no exito
	// access public
	//
	// Autor: Juan Diego Ocampo Q.
	// Fecha de Creacion: 11/04/2008
	//////////////////////////////////////////////////////////////////////////////////////
	function dbLockTables($tabla)
	{
		$query = "LOCK TABLES " . $tabla. " WRITE; "; 
		if($this->dbQuery($query) != false)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	//////////////////////////////////////////////////////////////////////////////////////
	// Desbloquea las tablas que se encuentren bloquea una tabla a modo de escritura
	// 
	//
	// parameter: 
	// return: true en caso de exito
	// return: false en caso de no exito
	// access public
	//
	// Autor: Juan Diego Ocampo Q.
	// Fecha de Creacion: 11/04/2008
	//////////////////////////////////////////////////////////////////////////////////////
	function dbUnlockTables($tabla)
	{
		$query = "UNLOCK TABLES;"; 
		if($this->dbQuery($query) != false)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	//////////////////////////////////////////////////////////////////////////////////////
	// inicializa los valores del debug
	// 
	//
	// parameter: valor booleano
	// access public
	//
	// Autor: Juan Diego Ocampo Q.
	// Fecha de Creacion: 11/04/2008
	//////////////////////////////////////////////////////////////////////////////////////
	function debug($valor)
	{
		$this->debug = $valor;
	}
	//////////////////////////////////////////////////////////////////////////////////////
	// retorna la version de la base de datos
	// 
	//
	// parameter: 
	// access public
	//
	// Autor: Juan Diego Ocampo Q.
	// Fecha de Creacion: 11/04/2008
	//////////////////////////////////////////////////////////////////////////////////////
	function dbVersion()
	{
		$result = $this->dbQuery("SELECT VERSION() AS version");
		if($result != false && $this->dbNumRows($result)>0 )
		{
			$row = $this->dbFetchArray($result);
			return $row["version"];
		} 
		else 
		{
			$result = $this->dbQuery("SHOW VARIABLES LIKE 'version'");
			if( $result != FALSE && $this->dbNumRows($result) > 0 )
			{
				$row = $this->dbFetchRow($result);
				return $row["version"];
			}
		}
		return -1;
		//return '3.21.0';
	}
	//////////////////////////////////////////////////////////////////////////////////////
	// Constructor de clase. 
	// inicializa los atributos de la clase con los valores de las constantes del archivo 
	// de configuracion
	// 
	//
	// parameter: 
	// return: 
	// access public
	//
	// Autor: Juan Diego Ocampo Q.
	// Fecha de Creacion: 11/04/2008
	//////////////////////////////////////////////////////////////////////////////////////
	function setAtributo($atributo, $valor)
	{
		switch($atributo)
		{
			case "login": $this->login = $valor; break;
			case "password": $this->password = $valor; break;
			case "host": $this->host = $valor; break;
			case "nombre": $this->nombre = $valor; break;
			case "conexion": $this->conexion = $valor; break;
			case "debug": $this->debug = $valor; break;
			case "urlError": $this->urlError = $valor; break;
		}
	}
	/////////////////////////////////////////////////////////////////////////////////////
	// Constructor de clase. 
	// inicializa los atributos de la clase con los valores de las constantes del archivo 
	// de configuracion
	// 
	//
	// parameter: 
	// return: 
	// access public
	//
	// Autor: Juan Diego Ocampo Q.
	// Fecha de Creacion: 11/04/2008
	//////////////////////////////////////////////////////////////////////////////////////
	function getAtributo($atributo)
	{
		switch($atributo)
		{
			case "login": return $this->login; break;
			case "password": return $this->password; break;
			case "host": return $this->host; break;
			case "nombre": return $this->nombre; break;
			case "conexion": return $this->conexion; break;
			case "debug": return $this->debug; break;
			case "urlError": return $this->urlError; break;
		}
	}
}
?>